// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/files/file_util.h"

#include <errno.h>
#include <linux/magic.h>
#include <sys/vfs.h>

#include "base/files/file_path.h"

namespace base {

bool GetFileSystemType(const FilePath& path, FileSystemType* type)
{
    struct statfs statfs_buf;
    if (statfs(path.value().c_str(), &statfs_buf) < 0) {
        if (errno == ENOENT)
            return false;
        *type = FILE_SYSTEM_UNKNOWN;
        return true;
    }

    // Not all possible |statfs_buf.f_type| values are in linux/magic.h.
    // Missing values are copied from the statfs man page.
    switch (statfs_buf.f_type) {
    case 0:
        *type = FILE_SYSTEM_0;
        break;
    case EXT2_SUPER_MAGIC: // Also ext3 and ext4
    case MSDOS_SUPER_MAGIC:
    case REISERFS_SUPER_MAGIC:
    case BTRFS_SUPER_MAGIC:
    case 0x5346544E: // NTFS
    case 0x58465342: // XFS
    case 0x3153464A: // JFS
        *type = FILE_SYSTEM_ORDINARY;
        break;
    case NFS_SUPER_MAGIC:
        *type = FILE_SYSTEM_NFS;
        break;
    case SMB_SUPER_MAGIC:
    case 0xFF534D42: // CIFS
        *type = FILE_SYSTEM_SMB;
        break;
    case CODA_SUPER_MAGIC:
        *type = FILE_SYSTEM_CODA;
        break;
    case HUGETLBFS_MAGIC:
    case RAMFS_MAGIC:
    case TMPFS_MAGIC:
        *type = FILE_SYSTEM_MEMORY;
        break;
    case CGROUP_SUPER_MAGIC:
        *type = FILE_SYSTEM_CGROUP;
        break;
    default:
        *type = FILE_SYSTEM_OTHER;
    }
    return true;
}

} // namespace base
